<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 自定义构造函数之前,需要先捋清 new关键词做了哪些操作?
    // new关键词做了哪些操作?
    // 1. 创建一个纯净的实例化对象(空对象 {})
    // 2. 将this指向创建的实例化对象 this -> {}  (对象是引用类型 通过将关键词this指向创建的对象 ,后续可以给创建的对象添加数据)
    // 3. 返回创建的实例化对象

    // 注意:
    // 1. 每次调用构造函数,都会重新执行构造函数的上下文 => 不同的实例化对象
    // 2. 构造函数中的this指向本次构造函数执行过程中创建的实例化对象 
    // 3. 为了区分普通函数和构造函数 要求构造函数首字母大写

    // 普通函数调用   this-> window  返回值 -> undefined
    function fn() {
        console.log("this", this)
    }
    var result = fn()
    console.log("返回值", result)

    console.log('------------------------------------------------')
    //  作为构造函数调用(自定义构造函数)
    function Fn() {
        // {}
        // this -> {}
        console.log("this", this, this instanceof Fn)
        // 我们要做的操作: 在函数执行过程中 将属性和方法绑定到创建的实例化对象上
        this.a = 1  // {a:1}
        this.b = 2  // {a:1,b:2}
        // return this 
    }

    // 调用构造函数Fn 创建新的实例化对象,将其赋值给变量result(result引用创建的实例化对象)
    var result = new Fn()
    console.log("返回值", result)

    var result1 = new Fn()
    console.log("返回值", result1)
    //result 并不等于 result1  虽然值是一样的，但并不是同一个引用地址
    console.log(result == result1)
</script>

</html>